import os
import shutil
import time
from prettytable import PrettyTable


# 查看文件列表并显示为表格
def list_files():
    files = os.listdir("files/")  # 获取files目录下的文件列表
    table = PrettyTable()
    table.field_names = ["文件名", "类型", "大小", "创建时间"]

    for file in files:
        path = os.path.join("files", file)
        if os.path.isfile(path):  # 过滤目录，仅显示文件
            stat_info = os.stat(path)  # 获取文件属性
            file_type = "文件"
            size = f"{stat_info.st_size}字节"
            ctime = time.ctime(stat_info.st_ctime)  # 转换时间戳为可读格式
            table.add_row([file, file_type, size, ctime])

    print(table)


# 添加新文件（创建空文件）
def add_file():
    filename = input("请输入要创建的文件名：")
    full_path = os.path.join("files", filename)
    try:
        with open(full_path, "w") as f:  # 使用open创建新文件[^1]
            print(f"文件 {filename} 已创建")
    except Exception as e:
        print(f"创建失败：{str(e)}")


# 删除文件
def delete_file():
    filename = input("请输入要删除的文件名：")
    full_path = os.path.join("files", filename)
    if os.path.exists(full_path):  # 检查文件是否存在[^2]
        try:
            os.remove(full_path)  # 执行删除操作[^2]
            print(f"文件 {filename} 已删除")
        except Exception as e:
            print(f"删除失败：{str(e)}")
    else:
        print("文件不存在")


# 重命名文件
def rename_file():
    old_name = input("请输入原文件名：")
    new_name = input("请输入新文件名：")
    old_path = os.path.join("files", old_name)
    new_path = os.path.join("files", new_name)
    if os.path.exists(old_path):  # 检查原文件存在[^2]
        try:
            os.rename(old_path, new_path)  # 执行重命名[^2]
            print(f"文件已重命名为 {new_name}")
        except Exception as e:
            print(f"重命名失败：{str(e)}")
    else:
        print("原文件不存在")


# 复制文件副本
def copy_file():
    src_name = input("请输入源文件名：")
    dst_name = input("请输入目标文件名：")
    src_path = os.path.join("files", src_name)
    dst_path = os.path.join("files", dst_name)
    if os.path.exists(src_path):  # 检查源文件存在[^2]
        try:
            shutil.copy(src_path, dst_path)  # 使用shutil复制文件[^1]
            print(f"文件已复制为 {dst_name}")
        except Exception as e:
            print(f"复制失败：{str(e)}")
    else:
        print("源文件不存在")


# 查看文件属性
def get_file_info():
    filename = input("请输入文件名：")
    full_path = os.path.join("files", filename)
    if os.path.exists(full_path):
        try:
            stat_info = os.stat(full_path)  # 获取文件属性
            table = PrettyTable()
            table.field_names = ["属性", "值"]

            table.add_row(["文件名", filename])
            table.add_row(["大小", f"{stat_info.st_size}字节"])
            table.add_row(["创建时间", time.ctime(stat_info.st_ctime)])
            table.add_row(["最后修改时间", time.ctime(stat_info.st_mtime)])
            table.add_row(["最后访问时间", time.ctime(stat_info.st_atime)])
            table.add_row(["设备ID", stat_info.st_dev])
            table.add_row(["inode", stat_info.st_ino])
            table.add_row(["保护模式", stat_info.st_mode])
            table.add_row(["硬链接数", stat_info.st_nlink])
            table.add_row(["所有者用户ID", stat_info.st_uid])
            table.add_row(["所有者组ID", stat_info.st_gid])

            print(table)
        except Exception as e:
            print(f"获取属性失败：{str(e)}")
    else:
        print("文件不存在")


def main():
    while True:
        print("\n文件管理系统")
        print("【1】查看文件列表")
        print("【2】添加文件")
        print("【3】删除文件")
        print("【4】重命名文件")
        print("【5】复制文件")
        print("【6】查看文件属性")
        print("【Q】退出系统")
        choice = input("请选择操作：")

        if choice == "1":
            list_files()
        elif choice == "2":
            add_file()
        elif choice == "3":
            delete_file()
        elif choice == "4":
            rename_file()
        elif choice == "5":
            copy_file()
        elif choice == "6":
            get_file_info()
        elif choice.lower() == "q":
            print("退出系统")
            break
        else:
            print("无效选项，请重新选择")


if __name__ == "__main__":
    main()
